package ar.fiuba.tp7552.buildadmin.dao.impl;

import java.util.Collection;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.springframework.transaction.annotation.Transactional;

import ar.fiuba.tp7552.buildadmin.dao.GenericDaoHibernate;
import ar.fiuba.tp7552.buildadmin.dao.PropiedadDao;
import ar.fiuba.tp7552.buildadmin.model.builds.Edificio;
import ar.fiuba.tp7552.buildadmin.model.builds.Propiedad;
import ar.fiuba.tp7552.buildadmin.model.builds.PropiedadCriteria;
import ar.fiuba.tp7552.buildadmin.model.builds.Responsable;
import ar.fiuba.tp7552.buildadmin.util.Cast;


@Transactional
public class PropiedadDaoImpl extends GenericDaoHibernate<Propiedad, Long> implements PropiedadDao {

	public PropiedadDaoImpl() {
		super(Propiedad.class);
	}

	
	@Override
	public Collection<Propiedad> find(PropiedadCriteria criteria) {
		Session session = this.getHibernateSession();
		Criteria crit = session.createCriteria(Propiedad.class);
		
		if (criteria.getUf() != null) {
			crit.add(Restrictions.eq("UF", criteria.getUf()));
		}
		
		crit.createCriteria("tipo", "t")
			.add(Restrictions.eq("t.edificio", criteria.getEdificio()));
		return Cast.collection(Propiedad.class, crit.list());
	}
	
	
	public Collection<Propiedad> getAll(Edificio edificio) {
		Session session = this.getHibernateSession();
		Criteria hcrit = session.createCriteria(Propiedad.class)
			.createCriteria("tipo", "t")
			.add(Restrictions.eq("t.edificio", edificio));
		return Cast.list(Propiedad.class, hcrit.list());
	}	
	
	//FIXME
	public Collection<Propiedad> find(Edificio edificio, Responsable responsable){
		Session session = this.getHibernateSession();
		Criteria crit = session.createCriteria(Propiedad.class)
		.add(Restrictions.disjunction()
		.add(Restrictions.eq("propietario", responsable)) // Es un OR
		.add(Restrictions.eq("inquilino", responsable))
		.add(Restrictions.eq("apoderado", responsable))
		)
		.createAlias("tipo", "t")
		.add(Restrictions.eq("t.edificio", edificio));
		return Cast.list(Propiedad.class, crit.list());
		}
}


 